home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / C64 / T-TPUG Old Monthly Disks / (c)t6.d64 / life.c (.txt) < prev    next >
Commodore BASIC  |  2007-02-04  |  19KB  |  532 lines

  1. 140 REM ******************************
  2. 150 REM A SIMULATION OF "[141]L I F E[154][141][146]"
  3. 160 REM ******************************
  4. 170 REM WRITTEN BY GLEN BODIE
  5. 180 REM            90 KINGSMOUNT PK RD
  6. 190 REM            TORONTO, ONTARIO
  7. 200 REM            (416) 461-3483
  8. 210 REM ******************************
  9. 220 REM YOU ARE ALLOWED TO COPY AND         DISTRIBUTE THIS PROGRAM TO ANYONE,
  10. 230 REM BUT MAY NOT USE IT IN ANY WAY       FOR PROFIT.
  11. 240 REM IF YOU HAVE ANY QUESTIONS OR        SUGGESTIONS OR WISH TO DISCUSS THE
  12. 250 REM PROGRAM, PLEASE WRITE OR CALL       ME AT THE ABOVE ADDRESS.
  13. 260 REM ******************************
  14. 270 REM THIS IS A SIMULATION OF THE         GROWTH, BIRTH AND DEATH OF CELLS
  15. 280 REM IN A CLOSED COLONY.  IT IS BASED    ON A SCIENTIFIC AMERICAN ARTICLE
  16. 290 REM WRITTEN BY JOHN CONWAY FROM         CAMBRIDGE UNIVERSITY, LONDON IN
  17. 300 REM OCTOBER 1970.
  18. 310 REM THE SOURCE FOR THIS PROGRAM IS      IN A COMBINATION OF BASIC AND ML
  19. 320 REM CODE AS FOLLOWS:
  20. 330 REM "LIFE.BAS" - BASIC STATEMENTS
  21. 340 REM "LIFE.ASM" - ML STATEMENTS
  22. 350 REM THE FINAL PROGRAM WAS GENERATED     BY PAL-64 FROM PRO-LINE.  IN ORDER
  23. 360 REM TO RECREATE THE OBJECT CODE,        LOAD PAL-64 INTO YOUR MACHINE THEN
  24. 370 REM LOAD AND RUN "LIFE.BAS".  THE       ASSEMBLY TAKES ABOUT 8 MINUTES.
  25. 380 REM THE RESULT OF THE ASSEMBLY IS 2     FILES ON YOUR DISK:
  26. 390 REM "LIFE" - THE EXECUTABLE PROGRAM
  27. 400 REM "LIFE.SYM" - THE SYMBOL TABLE
  28. 410 REM ******************************
  29. 420 REM "[141]PROTECTED[154]"(null)
  30. 430 REM ******************************
  31. 440 REM *** SETUP
  32. 450 REM ******************************
  33. 460 PRINT "[147]";
  34. 470 POKE 53280,6 : POKE 53281,12
  35. 480 I=10*4096-3*(40*60)-2*1024
  36. 490 POKE 52,I/256 : POKE 56,PEEK(52)
  37. 500 POKE 51,I-PEEK(52)*256
  38. 510 POKE 55,PEEK(51)
  39. 520 T$="[147]                [144]L I F E[146]"
  40. 530 I$="INITIALIZATION: PHASE "
  41. 540 MS$=""
  42. 550 PRINT T$MS$I$"1[146]";
  43. 560 DIM ZZ%(255,1) : DIM DE$(15)
  44. 570 SKIP=0 : PARM=255 : BUFF=704
  45. 575 SC%=0 : Z=-1
  46. 580 REM ******************************
  47. 590 REM *** TRANSFER CHARACTER SET
  48. 600 REM ******************************
  49. 610 POKE 56334,PEEK(56334) AND 254
  50. 620 POKE 1,PEEK(1) AND 251
  51. 630 FOR I=53248 TO 55296
  52. 640 POKE I-2048,PEEK(I) : NEXT
  53. 650 POKE 1,PEEK(1) OR 4
  54. 660 POKE 56334,PEEK(56334) OR 1
  55. 670 REM ******************************
  56. 680 REM *** CHANGE SCREEN POINTERS
  57. 690 REM ******************************
  58. 700 PRINT CHR$(8)
  59. 710 POKE 56578,PEEK(56578) OR 3
  60. 720 POKE 56576,PEEK(56576)AND 252
  61. 730 POKE 53272,(PEEK(53272)AND 240)OR 2
  62. 740 POKE 648,196
  63. 750 PRINT T$MS$I$"2[146]";
  64. 760 VIC2=12*4096 : REM VIC-II CHIP
  65. 770 SM=VIC2+1024 : REM SCREEN MEMORY
  66. 780 CH=VIC2+2048 : REM CHARACTER SET
  67. 790 CM=55296     : REM COLOUR MEMORY
  68. 800 REM ******************************
  69. 810 REM *** DEFINE NEW CHARACTERS
  70. 820 REM ******************************
  71. 830 NC%=70 : REM NEW CHARACTER'S CODE
  72. 840 FOR I=0 TO 15 : FOR J=0 TO 7
  73. 850 READ I% : POKE CH+8*(I+NC%)+J,I%
  74. 860 NEXT J : NEXT I
  75. 870 DATA 0,0,0,0,0,0,0,0
  76. 880 DATA 240,240,240,240,0,0,0,0
  77. 890 DATA 15,15,15,15,0,0,0,0
  78. 900 DATA 255,255,255,255,0,0,0,0
  79. 910 DATA 0,0,0,0,240,240,240,240
  80. 920 DATA 240,240,240,240,240,240,240,240
  81. 930 DATA 15,15,15,15,240,240,240,240
  82. 940 DATA 255,255,255,255,240,240,240,240
  83. 950 DATA 0,0,0,0,15,15,15,15
  84. 960 DATA 240,240,240,240,15,15,15,15
  85. 970 DATA 15,15,15,15,15,15,15,15
  86. 980 DATA 255,255,255,255,15,15,15,15
  87. 990 DATA 0,0,0,0,255,255,255,255
  88. 1000 DATA 240,240,240,240,255,255,255,255
  89. 1010 DATA 15,15,15,15,255,255,255,255
  90. 1020 DATA 255,255,255,255,255,255,255,255
  91. 1030 REM ******************************
  92. 1040 REM *** DEFINE SPRITES FOR CURSOR
  93. 1050 REM ******************************
  94. 1060 FOR I=12 TO 63 :POKE VIC2+64*1+I,0
  95. 1070 POKE VIC2+64*2+I,0 : NEXT
  96. 1080 FOR I=0 TO 11 : READ I%
  97. 1090 POKE VIC2+64*1+I,I% : NEXT
  98. 1100 FOR I=0 TO 11 : READ I%
  99. 1110 POKE VIC2+64*2+I,I% : NEXT
  100. 1120 POKE 53269,0 : POKE 53275,0
  101. 1130 POKE 53287,7 : POKE SM+1016,1
  102. 1140 POKE 53271,0 : POKE 53277,0
  103. 1150 DATA 240,0,0,144,0,0,144,0,0,240,0,0
  104. 1160 DATA 0,0,0,96,0,0,96,0,0,0,0,0
  105. 1170 REM ******************************
  106. 1180 REM *** DEFINE MENU ITEMS
  107. 1190 REM ******************************
  108. 1200 FK$(1)="[144]F1[146] EDIT [157][157][157][157][157][157][157][157]F2[146] RERUN[157][157][157][157][157][157][157][157]F3[146] RUN  [157][157][157][157][157][157][157][157]"
  109. 1210 FK$(1)=FK$(1)+"F4[146] SKIP [157][157][157][157][157][157][157][157]F5[146] SCROL[157][157][157][157][157][157][157][157]F6[146] CENTR[157][157][157][157][157][157][157][157]"
  110. 1220 FK$(1)=FK$(1)+"F7[146] EXIT [157][157][157][157][157][157][157][157]F8[146] HELP [157][157][157][157][157][157][157][157]SKIP:   [157][157][157][157][157][157][157][157]"
  111. 1230 FK$(1)=FK$(1)+"GEN:    "
  112. 1240 FK$(2)="[144]F1[146] LOAD [157][157][157][157][157][157][157][157]F2[146] RESET[157][157][157][157][157][157][157][157]F3[146] SAVE [157][157][157][157][157][157][157][157]"
  113. 1250 FK$(2)=FK$(2)+"F4[146]      [157][157][157][157][157][157][157][157]F5[146] CLEAR[157][157][157][157][157][157][157][157]F6[146]      [157][157][157][157][157][157][157][157]"
  114. 1260 FK$(2)=FK$(2)+"F7[146] RETRN[157][157][157][157][157][157][157][157]F8[146] HELP [157][157][157][157][157][157][157][157]        [157][157][157][157][157][157][157][157]"
  115. 1270 FK$(2)=FK$(2)+"        "
  116. 1280 REM ******************************
  117. 1290 REM *** DEFINE MESSAGES
  118. 1300 REM ******************************
  119. 1310 SG$="[144] "
  120. 1320 MS$(0)="READY.....                            "
  121. 1330 MS$(1)="CURSORS TO MOVE, SPACE BAR TO ADD/DEL[160]"
  122. 1340 MS$(2)="UPDATE BY 1 GENERATION                "
  123. 1350 MS$(3)="ENTER # OF GENERATIONS TO SKIP:       [157][157][157][157][157][157]"
  124. 1360 MS$(4)="CURSORS ARE NOW ACTIVE FOR SCROLLING  "
  125. 1370 MS$(5)="CENTRE THE PATTERN                    "
  126. 1380 MS$(6)="ENTER FILE TO LOAD:                   [157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157]"
  127. 1390 MS$(7)="ENTER FILE TO SAVE:                   [157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157][157]"
  128. 1400 MS$(8)="THE COLONY WILL BE DESTROYED          "
  129. 1410 MS$(9)="SCROLLING.....                        "
  130. 1420 MS$(10)="RERUNNING SEQUENCE FROM THE START.    "
  131. 1430 C$="[144]PRESS SHIFT[146][144] TO CONTINUE.....     "
  132. 1440 REM ******************************
  133. 1450 REM *** DISK ERROR MESSAGES
  134. 1460 REM ******************************
  135. 1470 DE$="DISK ERROR: "
  136. 1480 DE$(0)="NO ERROR"
  137. 1490 DE$(1)="TOO MANY OPEN FILES"
  138. 1500 DE$(2)="FILE ALREADY OPEN"
  139. 1510 DE$(3)="FILE NOT OPEN"
  140. 1515 DE$(14)="END OR IDENTIFY"
  141. 1520 DE$(4)="FILE NOT FOUND"
  142. 1530 DE$(5)="DEVICE NOT PRESENT"
  143. 1540 DE$(6)="FILE NOT INPUT TYPE"
  144. 1550 DE$(7)="FILE NOT OUTPUT TYPE"
  145. 1560 DE$(8)="FILE NAME MISSING"
  146. 1570 DE$(9)="ILLEGAL DEVICE #"
  147. 1580 DE$(10)="STOP KEY PRESSED"
  148. 1590 DE$(11)="RS-232 BUFFER ALLOC"
  149. 1600 DE$(12)="TIMEOUT WRITE"
  150. 1610 DE$(13)="TIMEOUT READ"
  151. 1620 DE$(14)="END OR IDENT LINE"
  152. 1630 DE$(15)="DEVICE NOT PRESENT"
  153. 1640 REM ******************************
  154. 1650 REM *** CREATE THE FIELD
  155. 1660 REM ******************************
  156. 1670 PRINT T$MS$I$"3[146]"
  157. 1680 FOR I=2 TO 21 : FOR J=9 TO 38
  158. 1690 POKE CM+I*40+J,0
  159. 1700 POKE SM+I*40+J,NC%
  160. 1710 NEXT J : NEXT I
  161. 1720 PRINT TAB(8)"[172][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162]"
  162. 1730 FOR I=2 TO 21
  163. 1740 PRINT TAB(8)"[161]" : NEXT
  164. 1750 PRINT TAB(8)"[188][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162][162]"
  165. 1760 POKE SM+79,123 : POKE CM+79,6
  166. 1770 POKE SM+919,126 : POKE CM+919,6
  167. 1780 FOR I=119 TO 879 STEP 40
  168. 1790 POKE SM+I,97 : POKE CM+I,6 : NEXT
  169. 1800 REM ******************************
  170. 1810 REM *** MAIN MENU + KEY DECODING
  171. 1820 REM ******************************
  172. 1830 POKE PARM,1 : SYS18635
  173. 1840 POKE PARM,1 : SYS20574
  174. 1850 PG%=1 : SC%=0 : POKE 53269,0
  175. 1860 PRINT FK$(PG%);
  176. 1870 POKE 198,0 : PRINT MS$MS$(0);
  177. 1880 GOSUB 2020
  178. 1890 GET K$ : IF K$ = "" THEN GOTO 1890
  179. 1900 K=ASC(K$)
  180. 1910 IF K<133 THEN GOTO 1930
  181. 1920 ON K-132 GOTO 2980,2340,2600,2750,2070,2450,2660,4270
  182. 1930 IF SC%=0 THEN GOTO 1890
  183. 1940 IF K=145 THEN POKE PARM,1 : GOTO 2890
  184. 1950 IF K=017 THEN POKE PARM,2 : GOTO 2890
  185. 1960 IF K=157 THEN POKE PARM,3 : GOTO 2890
  186. 1970 IF K=029 THEN POKE PARM,4 : GOTO 2890
  187. 1980 GOTO 1890
  188. 1990 REM ******************************
  189. 2000 REM *** UPDATE THE GEN/SKIP DATA
  190. 2010 REM ******************************
  191. 2020 PRINT SG$RIGHT$(STR$(SKIP),2)"[157][157][157][157][157][157][157][157] "RIGHT$(" "+STR$(GEN),3)
  192. 2030 RETURN
  193. 2040 REM ******************************
  194. 2050 REM *** RERUN THE WHOLE THING
  195. 2060 REM ******************************
  196. 2070 WAIT 653,1,1 : REM TILL NO SHIFT
  197. 2080 PRINT MS$MS$(10);
  198. 2090 POKE PARM,2 : SYS20574
  199. 2100 SYS18712
  200. 2110 GEN=0 : GOSUB 2020
  201. 2120 FOR I=0 TO Z : I%=PEEK(653)
  202. 2130 IF (I% AND 1)=1 THEN GOTO 2300
  203. 2140 IF (I% AND 4)=0 THEN GOTO 2160
  204. 2150 FOR K=1 TO 600 : NEXT K
  205. 2160 ON ZZ%(I,0) GOTO 2180,2250,2270
  206. 2170 GOTO 2290
  207. 2180 FOR J=1 TO ZZ%(I,1) : I%=PEEK(653)
  208. 2190 IF (I% AND 1)=1 THEN GOTO 2300
  209. 2200 IF (I% AND 4)=0 THEN GOTO 2220
  210. 2210 FOR K=1 TO 600 : NEXT K
  211. 2220 SYS19045 : SYS18712
  212. 2230 GEN=GEN+1 : GOSUB 2020
  213. 2240 NEXT J : GOTO 2290
  214. 2250 POKE PARM,ZZ%(I,1) : SYS19883
  215. 2260 GOTO 2280
  216. 2270 SYS20381
  217. 2280 SYS18712
  218. 2290 NEXT I
  219. 2300 SC%=0 : GOTO 1870
  220. 2310 REM ******************************
  221. 2320 REM *** RUN FOR 1 GENERATION
  222. 2330 REM ******************************
  223. 2340 PRINT MS$MS$(2); : GEN=GEN+1
  224. 2350 SYS19045
  225. 2360 SYS18712
  226. 2370 IF Z=-1 THEN GOTO 2400
  227. 2380 IF ZZ%(Z,0)=1 THEN ZZ%(Z,1)=ZZ%(Z,1)+1 : GOTO 2410
  228. 2390 IF Z=255 THEN GOTO 2410
  229. 2400 Z=Z+1 : ZZ%(Z,0)=1 : ZZ%(Z,1)=1
  230. 2410 SC%=0 : GOTO 1870
  231. 2420 REM ******************************
  232. 2430 REM *** SKIP # OF GENERATIONS
  233. 2440 REM ******************************
  234. 2450 PRINT MS$MS$(3); : SC%=0
  235. 2460 INPUT N : IF N<1 THEN N=1
  236. 2470 IF N>99 THEN N=99
  237. 2480 IF Z=-1 THEN GOTO 2510
  238. 2490 IF ZZ%(Z,0)=1 THEN ZZ%(Z,1)=ZZ%(Z,1)+N : GOTO 2520
  239. 2500 IF Z=255 THEN GOTO 2520
  240. 2510 Z=Z+1 : ZZ%(Z,0)=1 : ZZ%(Z,1)=N
  241. 2520 FOR SKIP=N TO 1 STEP -1
  242. 2530 SYS19045 : SYS18712
  243. 2540 GEN=GEN+1 : GOSUB 2020
  244. 2550 NEXT
  245. 2560 SYS18712 : GOTO 1870
  246. 2570 REM ******************************
  247. 2580 REM *** SCROLL THE PATTERN
  248. 2590 REM ******************************
  249. 2600 PRINT MS$MS$(4);
  250. 2610 FOR T=1 TO 600 : NEXT
  251. 2620 SC%=1 : GOTO 1870
  252. 2630 REM ******************************
  253. 2640 REM *** CENTRE THE PATTERN
  254. 2650 REM ******************************
  255. 2660 PRINT MS$MS$(5); : SC%=0
  256. 2670 SYS20381
  257. 2680 SYS18712
  258. 2690 IF Z=255 THEN GOTO 2710
  259. 2700 Z=Z+1 : ZZ%(Z,0)=3 : ZZ%(Z,1)=0
  260. 2710 GOTO 1870
  261. 2720 REM ******************************
  262. 2730 REM *** PROGRAM END
  263. 2740 REM ******************************
  264. 2750 POKE 53272,(PEEK(53272)AND 240)OR5
  265. 2760 POKE 56576,PEEK(56576) OR 3
  266. 2770 POKE 56578,PEEK(56578) OR 3
  267. 2780 POKE 648,4
  268. 2790 I=10*4096 : REM RESET TOP OF MEMRY
  269. 2800 POKE 52,I/256 : POKE 56,PEEK(52)
  270. 2810 POKE 51,I-PEEK(52)*256
  271. 2820 POKE 55,PEEK(51) : CLR
  272. 2830 POKE 53280,14 : POKE 53281,6
  273. 2840 PRINT "[147][154]LIFE IS OVER"CHR$(9)
  274. 2850 GOTO 5370
  275. 2860 REM ******************************
  276. 2870 REM *** MOVE THE PATTERN AROUND
  277. 2880 REM ******************************
  278. 2890 PRINT MS$MS$(9);
  279. 2900 SYS19883
  280. 2910 SYS18712
  281. 2920 IF Z=255 THEN GOTO 2940
  282. 2930 Z=Z+1 : ZZ%(Z,0)=2 : ZZ%(Z,1)=PEEK(PARM)
  283. 2940 GOTO 1870
  284. 2950 REM ******************************
  285. 2960 REM *** EDIT MENU + KEY DECODING
  286. 2970 REM ******************************
  287. 2980 PG%=2 : SP%=1 : RE%=0
  288. 2990 POKE SM+1016,SP% : POKE 53269,1
  289. 3000 POKE 53248,96 : POKE 53249,66
  290. 3010 POKE 53264,0
  291. 3020 PRINT FK$(PG%); : SC%=0
  292. 3030 POKE 198,0 : PRINT MS$MS$(1);
  293. 3040 GET K$ : IF K$="" THEN GOTO 3140
  294. 3050 K=ASC(K$)
  295. 3060 IF K<133 THEN GOTO 3080
  296. 3070 ON K-132 GOTO 3350,3630,4040,4120,3570,3140,3140,4270
  297. 3080 X%=PEEK(53248)+256*(PEEK(53264) AND 1) : Y%=PEEK(53249)
  298. 3090 IF K=032 THEN GOTO 4220
  299. 3100 IF K=145 THEN GOTO 3210
  300. 3110 IF K=017 THEN GOTO 3230
  301. 3120 IF K=157 THEN GOTO 3250
  302. 3130 IF K=029 THEN GOTO 3270
  303. 3140 FOR T=1 TO 25 : NEXT
  304. 3150 SP%=SP%-(SP%=1)+(SP%=2)
  305. 3160 POKE SM+1016,SP%
  306. 3170 GOTO 3040
  307. 3180 REM ******************************
  308. 3190 REM *** MOVE THE CURSOR AROUND
  309. 3200 REM ******************************
  310. 3210 Y%=Y%-4 : IF Y%<66 THEN Y%=222
  311. 3220 GOTO 3240
  312. 3230 Y%=Y%+4 : IF Y%>222 THEN Y%=66
  313. 3240 POKE 53249,Y% : GOTO 3140
  314. 3250 X%=X%-4 : IF X%<96 THEN X%=332
  315. 3260 GOTO 3280
  316. 3270 X%=X%+4 : IF X%>332 THEN X%=96
  317. 3280 POKE 53264,X%/256
  318. 3290 POKE 53248,X%-256*PEEK(53264)
  319. 3300 FOR T=1 TO 10 : NEXT
  320. 3310 GOTO 3150
  321. 3320 REM ******************************
  322. 3330 REM *** LOAD A NEW PATTERN
  323. 3340 REM ******************************
  324. 3350 POKE 53269,0
  325. 3360 PRINT MS$MS$(6);
  326. 3370 GOSUB 3900 : FL$=FL$+"R"
  327. 3380 POKE BUFF+0,LEN(FL$)
  328. 3390 FOR I=1 TO LEN(FL$)
  329. 3400 POKE BUFF+I,ASC(MID$(FL$,I,1))
  330. 3410 NEXT
  331. 3420 OPEN 15,8,15
  332. 3430 SYS20715 : I=PEEK(PARM)
  333. 3440 INPUT#15,EN$,EM$
  334. 3450 IF VAL(EN$)<>0 THEN GOTO 3480
  335. 3460 IF I=0 OR I=14 THEN RE%=1 : GOTO 3510
  336. 3470 EM$=DE$(I)
  337. 3480 PRINT MS$DE$LEFT$(EM$+"                              ",26);
  338. 3490 FOR T=1 TO 1000 : NEXT
  339. 3500 POKE PARM,2 : SYS20574
  340. 3510 SYS18712
  341. 3520 CLOSE 2 : CLOSE 15
  342. 3530 POKE 53269,1 : GOTO 3030
  343. 3540 REM ******************************
  344. 3550 REM *** RESET TO THE ORIGINAL
  345. 3560 REM ******************************
  346. 3570 POKE PARM,2 : SYS20574
  347. 3580 SYS18712
  348. 3590 RE%=1 : GOTO 3140
  349. 3600 REM ******************************
  350. 3610 REM *** SAVE THE CURRENT PATTERN
  351. 3620 REM ******************************
  352. 3630 POKE 53269,0
  353. 3640 PRINT MS$MS$(7);
  354. 3650 GOSUB 3900 : FL$=FL$+"W"
  355. 3660 OPEN 15,8,15
  356. 3670 POKE BUFF+0,LEN(FL$)
  357. 3680 FOR I=1 TO LEN(FL$)
  358. 3690 POKE BUFF+I,ASC(MID$(FL$,I,1))
  359. 3700 NEXT
  360. 3710 SYS20867 : I=PEEK(PARM)
  361. 3720 INPUT#15,EN$,EM$
  362. 3730 IF VAL(EN$)=0 THEN GOTO 3810
  363. 3740 IF VAL(EN$)<>63 THEN GOTO 3830
  364. 3750 PRINT MS$"FILE EXISTS.  REPLACE (YES OR NO)?     [157][157][157][157]";
  365. 3760 GET K$ : IF K$="" THEN GOTO 3760
  366. 3770 IF K$<>"Y" AND K$<>"N" THEN GOTO 3760
  367. 3780 PRINT K$;
  368. 3790 IF K$="N" THEN GOTO 3850
  369. 3800 FL$="@"+FL$ : GOTO 3670
  370. 3810 IF I=0 THEN GOTO 3850
  371. 3820 EM$=DE$(I)
  372. 3830 PRINT MS$DE$LEFT$(EM$+"                              ",26);
  373. 3840 FOR T=1 TO 1000 : NEXT
  374. 3850 CLOSE 2 : CLOSE 15
  375. 3860 POKE 53269,1 : GOTO 3030
  376. 3870 REM ******************************
  377. 3880 REM *** GET THE FILENAME FROM USER
  378. 3890 REM ******************************
  379. 3900 FL$="" : N=0
  380. 3905 GET K$ : IF K$="" THEN GOTO 3905
  381. 3910 IF K$=CHR$(13) THEN GOTO 3945
  382. 3915 IF K$<CHR$(32) OR K$>CHR$(221) THEN GOTO 3930
  383. 3920 IF K$>CHR$(93) AND K$<CHR$(160) THEN GOTO 3930
  384. 3925 PRINT K$; : FL$=FL$+K$ : N=N+1 : GOTO 3905
  385. 3930 IF N=0 THEN GOTO 3900
  386. 3935 FOR I=0 TO N-1
  387. 3940 PRINT "[157] [157]"; : NEXT : GOTO 3900
  388. 3945 IF N=0 THEN FL$="SAVED"
  389. 3950 I$=LEFT$(FL$,1) : K$="0:"
  390. 3960 IF I$="0" OR I$="1" THEN K$=LEFT$(FL$,2) : FL$=RIGHT$(FL$,LEN(FL$)-2)
  391. 3970 IF I$="@" THEN K$=LEFT$(FL$,3) : FL$=RIGHT$(FL$,LEN(FL$)-3)
  392. 3980 IF LEN(FL$)>11 THEN FL$=LEFT$(FL$,11)
  393. 3990 FL$=K$+FL$+".LIFE,S,"
  394. 4000 RETURN
  395. 4010 REM ******************************
  396. 4020 REM *** WIPE OUT THE PATTERN
  397. 4030 REM ******************************
  398. 4040 PRINT MS$MS$(8);
  399. 4050 FOR T=1 TO 400 : NEXT
  400. 4060 POKE PARM,1 : REM CURRENT ARRAY
  401. 4070 SYS18635 : SYS18712
  402. 4080 RE%=1 : GOTO 3030
  403. 4090 REM ******************************
  404. 4100 REM *** RETURN TO MAIN MENU
  405. 4110 REM ******************************
  406. 4120 IF RE%=0 THEN GOTO 4180
  407. 4130 POKE PARM,1 : SYS20574
  408. 4140 IF Z=-1 THEN GOTO 4180
  409. 4150 FOR I=0 TO Z
  410. 4160 ZZ%(I,0)=0 : ZZ%(I,1)=0 : NEXT
  411. 4170 GEN=0 : Z=-1
  412. 4180 GOTO 1850
  413. 4190 REM ******************************
  414. 4200 REM *** ADD/DELETE A DOT
  415. 4210 REM ******************************
  416. 4220 SYS18847
  417. 4230 RE%=1 : GOTO 3140
  418. 4240 REM ******************************
  419. 4250 REM *** HELP INFORMATION
  420. 4260 REM ******************************
  421. 4270 POKE 53269,0
  422. 4280 POKE PARM,1 : SYS20457
  423. 4290 PRINT T$""
  424. 4300 PRINT TAB(5)"F1[146] GENERAL INFO"
  425. 4310 PRINT TAB(5)"F3[146] FUNCTION KEYS"
  426. 4320 PRINT TAB(5)"F5[146] RETURN"
  427. 4330 PRINT ""TAB(5)"PRESS THE FUNCTION KEY...."
  428. 4340 GET K$ : IF K$="" THEN 4340
  429. 4350 IF ASC(K$)<133 OR ASC(K$)>135 THEN GOTO 4340
  430. 4360 ON ASC(K$)-132 GOTO 4430,4890,4370
  431. 4370 POKE PARM,2 : SYS20457
  432. 4380 IF PG%=1 THEN GOTO 1870
  433. 4390 POKE 53269,1 : GOTO 3140
  434. 4400 REM ******************************
  435. 4410 REM *** GENERAL INFORMATION
  436. 4420 REM ******************************
  437. 4430 PRINT T$""
  438. 4440 PRINT "LIFE[144] IS A SIMULATION OF THE BIRTH,"
  439. 4450 PRINT "DEATH AND GROWTH OF CELLS IN A CLOSED"
  440. 4460 PRINT "ENVIRONMENT.  EACH GENERATION DEVELOPS"
  441. 4470 PRINT "BY LOOKING AT THE 8 NEIGHBOURING CELLS"
  442. 4480 PRINT "OF EACH CELL IN THE CURRENT GENERATION."
  443. 4490 PRINT "THE RULES USED IN THIS EVALUATION ARE:"
  444. 4500 PRINT "  GEN N  NEIGHBOURS  GEN N+1"
  445. 4510 PRINT "[144]  ALIVE  0,1.......  DEATH (ISOLATION)"
  446. 4520 PRINT "         2,3.......  STAYS ALIVE"
  447. 4530 PRINT "         4,5,6,7,8.  DEATH (CROWDED)"
  448. 4540 PRINT "  EMPTY  0,1,2.....  NO CHANGE"
  449. 4550 PRINT "         3.........  NEW CELL IS BORN"
  450. 4560 PRINT "         4,5,6,7,8.  NO CHANGE"
  451. 4570 PRINT "THUS EACH SUCCESSIVE GENERATION IS A"
  452. 4580 PRINT "DIRECT RESULT OF THE PREVIOUS ONE."
  453. 4590 PRINT MS$C$;
  454. 4600 WAIT 653,1,0
  455. 4610 PRINT T$""
  456. 4620 PRINT "MANY OF THE INITIAL PATTERNS OF CELLS"
  457. 4630 PRINT "WILL GROW AND CHANGE IN BIZARRE WAYS."
  458. 4640 PRINT "SOME WILL DEVOLVE INTO SINGLE OR SETS"
  459. 4650 PRINT "OF STABLE OR OSCILLATING PATTERNS:"
  460. 4660 C=102 : REM FIRST CHARACTER
  461. 4670 PRINT "STABLE[146]   BLOCK  [144]"CHR$(C+15)"     BOAT  [144]";
  462. 4680 PRINT CHR$(C+6)CHR$(C+9)
  463. 4690 PRINT TAB(28)CHR$(C+2)CHR$(C+1)""
  464. 4700 PRINT "OSCILLATING[146]  STREETLIGHTS   [144]"
  465. 4710 PRINT TAB(13)CHR$(C+0)CHR$(C+8)CHR$(C+12)CHR$(C+0)CHR$(C+0);
  466. 4720 PRINT TAB(25)CHR$(C+0)CHR$(C+0)CHR$(C+5)CHR$(C+0)CHR$(C+0)
  467. 4730 PRINT TAB(13)CHR$(C+8)CHR$(C+0)CHR$(C+0)CHR$(C+8)CHR$(C+0);
  468. 4740 PRINT TAB(25)CHR$(C+0)CHR$(C+0)CHR$(C+1)CHR$(C+0)CHR$(C+0)
  469. 4750 PRINT TAB(13)CHR$(C+10)CHR$(C+0)CHR$(C+0)CHR$(C+10)CHR$(C+0);
  470. 4760 PRINT TAB(25)CHR$(C+3)CHR$(C+1)CHR$(C+0)CHR$(C+3)CHR$(C+1)
  471. 4770 PRINT TAB(13)CHR$(C+0)CHR$(C+8)CHR$(C+12)CHR$(C+0)CHR$(C+0);
  472. 4780 PRINT TAB(25)CHR$(C+0)CHR$(C+0)CHR$(C+5)CHR$(C+0)CHR$(C+0)
  473. 4790 PRINT TAB(13)CHR$(C+0)CHR$(C+0)CHR$(C+0)CHR$(C+0)CHR$(C+0);
  474. 4800 PRINT TAB(25)CHR$(C+0)CHR$(C+0)CHR$(C+1)CHR$(C+0)CHR$(C+0)
  475. 4810 PRINT "THERE ARE MANY OTHER INTERESTING"
  476. 4820 PRINT "PATTERNS POSSIBLE.  EXPERIMENT A BIT"
  477. 4830 PRINT "AND SEE THE WIDE VARIETY OF LIFE[144]."
  478. 4840 PRINT MS$C$;
  479. 4850 WAIT 653,1,0 : GOTO 4290
  480. 4860 REM ******************************
  481. 4870 REM *** FUNCTION KEY INFORMATION
  482. 4880 REM ******************************
  483. 4890 PRINT T$""
  484. 4900 IF PG%=2 THEN GOTO 5120
  485. 4910 PRINT "[144]F1[146] EDIT    CREATE A NEW PATTERN OR EDIT"
  486. 4920 PRINT TAB(14)"THE EXISTING ONE."
  487. 4930 PRINT "[144]F2[146] RERUN   REPLAY THE SEQUENCE SO FAR."
  488. 4940 PRINT TAB(14)"[144]CTRL = SLOW;[144]SHIFT = HALT"
  489. 4950 PRINT "[144]F3[146] RUN     UPDATE THE PATTERN THROUGH"
  490. 4960 PRINT TAB(14)"ONE GENERATION."
  491. 4970 PRINT "[144]F4[146] SKIP    SKIP OVER A SPECIFIED"
  492. 4980 PRINT TAB(14)"NUMBER OF GENERATIONS."
  493. 4990 PRINT "[144]F5[146] SCROL   ENABLE THE [144]CRSR KEYS TO"
  494. 5000 PRINT TAB(14)"ALLOW SCROLLING."
  495. 5010 PRINT "[144]F6[146] CENTR   CENTRE THE PATTERN IN THE"
  496. 5020 PRINT TAB(14)"DISPLAY AREA."
  497. 5030 PRINT "[144]F7[146] EXIT    QUIT THE PROGRAM."
  498. 5040 PRINT
  499. 5050 PRINT "[144]F8[146] HELP    CALLUP A MENU TO GET"
  500. 5060 PRINT TAB(14)"PROGRAM INFORMATION.[144]"
  501. 5070 PRINT "[144]THE FIRST THING TO DO IS ENTER EDIT[144] "
  502. 5080 PRINT "MODE (F1[146]) TO CREATE THE PATTERN OF"
  503. 5090 PRINT "CELLS IN THE INITIAL COLONY."
  504. 5100 PRINT MS$C$;
  505. 5110 WAIT 653,1,0 : GOTO 4290
  506. 5120 PRINT "[144]F1[146] LOAD    LOAD A NEW PATTERN FROM A"
  507. 5130 PRINT TAB(14)"DISK FILE.(NAME<11 CHARS)"
  508. 5140 PRINT "[144]F2[146] RESET   CHANGE THE PATTERN BACK TO"
  509. 5150 PRINT TAB(14)"THE ORIGINAL PATTERN."
  510. 5160 PRINT "[144]F3[146] SAVE    SAVE THE PATTERN IN A"
  511. 5170 PRINT TAB(14)"DISK FILE.(NAME<11 CHARS)"
  512. 5180 PRINT "[144]F4[146]         NO FUNCTION."
  513. 5190 PRINT
  514. 5200 PRINT "[144]F5[146] CLEAR   ERASE THE CURRENT PATTERN."
  515. 5210 PRINT
  516. 5220 PRINT "[144]F6[146]         NO FUNCTION."
  517. 5230 PRINT
  518. 5240 PRINT "[144]F7[146] RETRN   RETURN TO THE MAIN PROGRAM"
  519. 5250 PRINT TAB(14)"DISPLAY AND MENU."
  520. 5260 PRINT "[144]F8[146] HELP    CALLUP A MENU TO GET"
  521. 5270 PRINT TAB(14)"PROGRAM INFORMATION.[144]"
  522. 5280 PRINT "NOTE: IF THE PATTERN GETS CHANGED, THE"
  523. 5290 PRINT "RERUN SEQUENCE GETS ERASED, THE GEN."
  524. 5300 PRINT "COUNTER IS RESET TO 0, AND A NEW START-"
  525. 5310 PRINT "ING PATTERN IS SAVED."
  526. 5320 PRINT MS$C$;
  527. 5330 WAIT 653,1,0 : GOTO 4290
  528. 5340 REM ******************************
  529. 5350 REM *** END AND LINK TO ML CODE
  530. 5360 REM ******************************
  531. 5370 END
  532.